/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.controlador;

import com.modelo.Libro;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.pdfbox.PDFToImage;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author Administrador
 */
@ManagedBean
@SessionScoped
public class ControladorLibros implements Serializable {

    /**
     * Creates a new instance of ControladorLibros
     */
    //Variables de componentes externos
    private UploadedFile archivoEntrante;
    //Variables del Modelo de Datos
    private Libro libro;
    private List<Libro> biblioteca;
    //Variables de control de la interfaz grafica
    private String contenidoPaginas;
    private int width;
    private int height;
    private int maximoPaginas;
    private Double totalCaracteresResolucion;

    public ControladorLibros() {
        maximoPaginas = 3;
        biblioteca = new ArrayList<Libro>();
        libro = new Libro();
        libro.setId(1);
        libro.setNombre("Trilogia De La Fundacion");
        libro.setEstado('A');
        libro.setFechaSubida(new Date());
        libro.setNumeroPaginas(234);
        biblioteca.add(libro);
        libro = new Libro();
        libro.setId(2);
        libro.setNombre("Interdicto");
        libro.setEstado('A');
        libro.setFechaSubida(new Date());
        libro.setNumeroPaginas(2);
        biblioteca.add(libro);
        libro = new Libro();
        libro.setId(3);
        libro.setNombre("La Hojarasca");
        libro.setEstado('A');
        libro.setFechaSubida(new Date());
        libro.setNumeroPaginas(40);
        biblioteca.add(libro);
    }

    public void calcularDistribucionPantalla() {
        double caracteresxFila = width / 15;
        double caracteresxColumna = height / 20;
        System.out.println("C:>" + caracteresxColumna);
        System.out.println("F:>" + caracteresxFila);
        totalCaracteresResolucion = caracteresxColumna * caracteresxFila;
        System.out.println("T:>" + totalCaracteresResolucion);
    }

    public void onClickCaratula(ActionEvent ae) {
        onLeer(((Libro) ae.getComponent().getAttributes().get("toRead")));
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("/lebook/faces/page/visorLibro.xhtml");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void onLeer(Libro libro) {
        try {
            System.out.println(width + " x " + height);
            File f = new File("C:/Adjuntos/"+libro.getId()+".pdf");
            FileInputStream stream = new FileInputStream(f);
            PDFParser parser = new PDFParser(stream);
            parser.parse();
            PDDocument pdDocument = new PDDocument(parser.getDocument());
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setStartPage(0);
            stripper.setEndPage(10);
            calcularDistribucionPantalla();
            generarPaginas(stripper.getText(pdDocument));

            pdDocument.close();
            stream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onSubirArchivo() {
        try {
            InputStream stream = archivoEntrante.getInputstream();
            PDFParser parser = new PDFParser(stream);
            parser.parse();
            PDDocument pdDocument = new PDDocument(parser.getDocument());
            String text = new PDFTextStripper().getText(pdDocument);
            FacesMessage msg = new FacesMessage(text);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void generarPortada() {
        try {
            String[] parametros = new String[3];
            parametros[0] = "-imageType";
            parametros[1] = "png";
            parametros[2] = "C:/Adjuntos/3.pdf";
            PDFToImage.main(parametros);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void guardarLibro(InputStream stream) {
        OutputStream out = null;
        try {
            out = new FileOutputStream(new File("C:/Adjuntos/aaa.pdf"));
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = stream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            stream.close();
            out.flush();
            out.close();
            FacesMessage msg = new FacesMessage("Archivo cargado :D");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(ControladorLibros.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void generarPaginas(String contenidoParcialLibro) {
        int cont = 0;
        String aux = null;
        StringBuilder paginas = new StringBuilder();
        //          \d\.|A-Z|\\n
        //          \\d\\.|^A-Z\\r\\n
        //          [^\\.|^A-Z]\\r\\n
        //          [^\\.|^A-Z]\\r\\n
//        System.out.println(unEscapeString(contenidoParcialLibro));
//        System.out.println("--------------");
        contenidoParcialLibro = contenidoParcialLibro.replaceAll("[^\\\\.|^A-Z]\\\\r\\\\n", " ");
//        System.out.println(unEscapeString(contenidoParcialLibro));
        while (cont != maximoPaginas & contenidoParcialLibro.length() >= 0) {
            if (totalCaracteresResolucion <= contenidoParcialLibro.length()) {
                aux = contenidoParcialLibro.substring(0, totalCaracteresResolucion.intValue());
                paginas.append(aux);
                paginas.append("`");
                contenidoParcialLibro = contenidoParcialLibro.replace(aux, "");
            } else {
                paginas.append(contenidoParcialLibro);
                contenidoParcialLibro = "";
            }
            cont++;
        }
        if (!paginas.toString().trim().isEmpty()) {
            contenidoPaginas = paginas.toString();
        }
    }

    public void generarPaginas(ActionEvent ae) {
        System.out.println("EN EL SERVIDOR....");
    }

    public static String unEscapeString(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '\n':
                    sb.append("\\n");
                    break;
                case '\r':
                    sb.append("\\r");
                    break;
                // ... rest of escape characters
                default:
                    sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }

    //<editor-fold defaultstate="collapsed" desc="GETTER & SETTER">
    public Libro getLibro() {
        return libro;
    }

    public void setLibro(Libro libro) {
        this.libro = libro;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public List<Libro> getBiblioteca() {
        return biblioteca;
    }

    public void setBiblioteca(List<Libro> biblioteca) {
        this.biblioteca = biblioteca;
    }

    public UploadedFile getArchivoEntrante() {
        return archivoEntrante;
    }

    public void setArchivoEntrante(UploadedFile archivoEntrante) {
        this.archivoEntrante = archivoEntrante;
    }

    public String getContenidoPaginas() {
        return contenidoPaginas;
    }

    public void setContenidoPaginas(String contenidoPaginas) {
        this.contenidoPaginas = contenidoPaginas;
    }
    //</editor-fold>
}
